package org.jeecgframework.web.service;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.common.model.json.DataGrid;
import org.jeecgframework.core.common.service.CommonService;
import org.jeecgframework.web.service.impl.ZyInspectionPlanServiceImpl;
import org.jeecgframework.web.system.pojo.base.ZyContactsEntity;
import org.jeecgframework.web.system.pojo.base.ZyInspectionPlanEntity;
import org.jeecgframework.web.system.pojo.base.ZyInspectionReportEntity;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface ZyInspectionPlanServiceI extends CommonService{
	
 	public <T> void delete(T entity);
 	
 	public <T> Serializable save(T entity);
 	
 	public <T> void saveOrUpdate(T entity);
 	
 	/**
	 * 默认按钮-sql增强-新增操作
	 * @param id
	 * @return
	 */
 	public boolean doAddSql(ZyInspectionPlanEntity t);
 	/**
	 * 默认按钮-sql增强-更新操作
	 * @param id
	 * @return
	 */
 	public boolean doUpdateSql(ZyInspectionPlanEntity t);
 	/**
	 * 默认按钮-sql增强-删除操作
	 * @param id
	 * @return
	 */
 	public boolean doDelSql(ZyInspectionPlanEntity t);
 	
 	/**
 	 * @author xiul
 	 * 2016-3-31 下午1:00:42
 	 * Description 生成巡检计划
 	 * @param zyInspectionPlanEntity 
 	 * @param addType 创建类型 是否为创建子单 
 	 */
 	public void generatePlanId(ZyInspectionPlanEntity zyInspectionPlanEntity,String addType);

 	/**
 	 * @author xiul
 	 * 2016-11-7 下午2:02:22
 	 * Description 根据 月份 返回季度 
 	 * @param ipMonth 月份
 	 * @return 季度
 	 */
 	public String getIpQuarterByMonth(String ipMonth);
 	
	/**@author xiul
	 * 2016-3-31 下午5:45:10
	 * Description 批量生成巡检计划
	 * @param zyInspectionPlan 巡检计划基础信息
	 * @param equipmentIds 设备ID
	 * @param parentId 父巡检计划id
	 * @param zyIpId 如果有值是第三方拒绝后重新指派第三方
	 */
	public void batchGeneratePlan(ZyInspectionPlanEntity zyInspectionPlan,String equipmentIds, String parentId,String zyIpId);

	/**@author xiul
	 * 2016-4-5 下午5:31:26
	 * Description 流程 - 启动流程 指派第三方负责人
	 * @param request
	 */
	public AjaxJson doBatchSendPlan(HttpServletRequest request);

	/**@author xiul
	 * 2016-4-11 下午4:44:30
	 * Description 根据rolecode获取第三方商务 datagrid
	 * @param request
	 * @param roleCode 页面选择的巡检单位值
	 * @return
	 */
	public void queryDatagridResultForChooseContacters(HttpServletRequest request,DataGrid dataGrid, String roleCode);
	

	/**@author xiul
	 * 2016-4-11 下午4:50:21
	 * Description 流程 - 新建巡检计划页 选择巡检工程师弹出页 datagrid
	 * @param request
	 * @param dataGrid 
	 * @param orgCode 页面隐藏域的值，巡检计划对应的巡检单位 （组织机构code）
	 * @param planIds 巡检计划IDs
	 * @return
	 */
	public void queryDatagridResultForChooseEngineers(HttpServletRequest request, DataGrid dataGrid, String orgCode, String planIds);

	/**@author xiul
	 * 2016-4-11 下午5:26:03
	 * Description 流程 - 推动 第三方负责人分配给工程师巡检任务
	 * @param planIds 巡检计划ID
	 * @param zyinpInspectionPlanEntity 包含 工程师，预约时间起止时间
	 */
	public AjaxJson doBatchAssignEngineer(String planIds,ZyInspectionPlanEntity zyinpInspectionPlanEntity);


	/**@author xiul
	 * 2016-4-11 下午5:26:03
	 * Description 第三方负责人分配再次转派巡检任务给工程师，以前的工程师不能再看到转派的任务
	 * @param planIds 巡检计划ID
	 * @param zyinpInspectionPlanEntity 包含 工程师，预约时间起止时间
	 */
	public AjaxJson doBatchAssignEngineers(String planIds,String engineerName,ZyInspectionPlanEntity zyinpInspectionPlanEntity);



	/**@author xiul
	 * 2016-4-11 下午6:09:56
	 * Description 流程 - 第三方负责人批量拒绝任务
	 * @param request 包含巡检任务IDs
	 * @return
	 */
	public String doBatchRefuseMission(String planIds,String remark,String fileId);


	/**@author xiul
	 * 2016-4-12 上午11:18:33
	 * Description 流程 - 工程师拒单
	 * @param planIds 巡检计划id
	 * @param remark 拒绝原因
	 */
	public String doBatchRefuseMissionOfEngineer(String planIds, String remark,String fileId);

	/**@author xiul
	 * 2016-4-12 上午11:22:51
	 * Description 流程 - 工程师接单
	 * @param planIds 巡检计划id
	 */
	public void doBatchEngineerAssignPlan(String planIds);

	/**@author xiul
	 * 2016-4-19 上午10:16:21
	 * Description 流程 - 区域工程师 指派工程师datagrid
	 * @param paramsMap
	 * @param orgCode 页面隐藏域的值，巡检计划对应的巡检单位 （组织机构code）
	 * @param planIds 巡检计划IDs
	 * @return
	 */
	public void queryDatagridResultForAreaChooseEngineers(HttpServletRequest request, DataGrid dataGrid, String orgCode, String planIds);

	/**@author xiul
	 * 2016-4-19 下午2:38:15
	 * Description 流程 - 区域工程师指派工程师 
	 * @param request 包含 planIDs ，工程师
	 * @param message
	 */
	public void doBatchAreaAssignEngineer(String planIds, String engineerId,String orderBeginTimeStr, String orderEndTimeStr);

	/**@author xiul
	 * 2016-4-22 下午6:01:12
	 * Description  流程 - 区域工程师拒单
	 * @param request
	 */
	public String doBatchRefuseMissionOfAreaEngineer(String planIds,String remark,String fileId);

	/**@author xiul
	 * 2016-4-26 上午11:04:43
	 * Description 流程 - 取消巡检计划
	 * @param t 巡检计划对象
	 * @param request 
	 */
	public void cancelInspectionPlan(ZyInspectionPlanEntity t, HttpServletRequest request);

	/**@author xiul
	 * 2016-5-6 下午2:20:06
	 * Description 根据在巡检问题分析报表点击数量 查询 对应的巡检计划
	 * @param year 年份
	 * @param month 月份
	 * @param exType 异常类型
	 * @param ttId 
	 * @return 巡检计划ids List
	 */
	public List<String> getPlanIdsByReportExceptionConditions(String year, String month, String exType, String ttId);
	//public List<String> getPlanIdsByReportExceptionConditions(String year, String month, String type);

	/**@author xiul
	 * 2016-5-9 上午11:44:13
	 * Description 根据流程实例ID 判断 当前工程师的上一个处理人是不是区域工程师
	 * @param processsId
	 * @param index 取倒数第几个处理人 不算当前位置
	 * @return
	 */
	public boolean judgeEngineerLastPersonIsAreaEngineer(String processsId,Integer index);

	/**@author xiul
	 * 2016-5-17 下午4:10:26
	 * Description 流程 - 第三方负责人批量分派任务之前判断是否存在不能拒绝或者分派的任务
	 * @param id 巡检计划ID
	 * @param j AjaxJson
	 * @param userId 
	 * @return false 不能操作
	 */
	public boolean judgeForBatchOperateMission(ZyInspectionPlanEntity zyIp, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-5-17 下午4:10:26
	 * Description 流程 - 第三方负责人批量拒绝任务之前判断是否存在不能拒绝或者分派的任务
	 * @param id 巡检计划ID
	 * @param j AjaxJson
	 * @param userId
	 * @return false 不能操作
	 */
	public boolean judgeForBatchOperateMissionPlan(ZyInspectionPlanEntity zyIp, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-5-17 下午4:10:26
	 * Description 流程 - 第三方负责人转派任务之前判断是否存在不能转派的任务
	 * @param id 巡检计划ID
	 * @param j AjaxJson
	 * @param userId
	 * @return false 不能操作
	 */
	public boolean judgeForBatchOperateMissions(ZyInspectionPlanEntity zyIp, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-5-17 下午4:40:25
	 * Description 巡检详情页面 - 是否有查看 和修改巡检报告按钮权限
	 * @param zyIpid 巡检计划 id
	 * @return 1 有，0没有
	 */
	public String judgeViewOrUpdateReport(String zyIpid);

	/**@author xiul
	 * 2016-5-19 下午4:16:03
	 * Description 
	 * @param esSn 设备sn
	 * @return
	 */
	public List<Map<String, Object>> queryIpForEsDetailsPage(String esSn);

	/**@author xiul
	 * 2016-5-19 下午4:25:42
	 * Description 
	 * @param request
	 * @param response
	 */
	public void exportInspectionPlan(HttpServletRequest request,HttpServletResponse response);

	/**
	 * 返回所有影院的巡检联系人（如果有多个随机取）
	 * @return key cinemaId value zyContacts
	 */
	public Map<String, ZyContactsEntity> queryCinemaIpContactsMap();
	
	/**@author xiul
	 * 2016-5-24 下午3:06:42
	 * Description 查询巡检计划 对应影院巡检联系人
	 * @param String cinemaId 影院ID
	 * @return 单个影院巡检联系人
	 */
	public ZyContactsEntity queryCinemaInspectionContact(String cinemaId);

	/**@author xiul
	 * 2016-7-4 上午11:23:24
	 * Description 
	 * @param request
	 * @param dataGrid
	 */
	public void queryDataGridOfSendPlanList(HttpServletRequest request,
			DataGrid dataGrid);

	/**@author xiul
	 * 2016-7-20 上午11:25:00
	 * Description 工程师更新巡检计划
	 * @param id 巡检计划id
	 * @param 工程师预约服务时间
	 * @param 工程师备注
	 */
	public void doEngineerUpdateIp(String id,String engineerOrderTime,String engineerRemark);

	/**@author xiul
	 * 2016-7-22 上午10:15:56
	 * Description 流程 - 指派工程师之前查询 是否包含不能操作的任务
	 * @param id 巡检计划id
	 * @param j
	 * @param userId
	 * @return
	 */
	public boolean judgeForAreaEngineerAssignEngineer(String id, AjaxJson j, String userId);
	/**@author xiul
	 * 2016-7-22 上午10:15:56
	 * Description 流程 - 在区域工程师 拒单之前查询 是否包含不能操作的任务
	 * @param id 巡检计划id
	 * @param j
	 * @param userId
	 * @return
	 */
	public boolean judgeForAreaEngineerAssignEngineerPlan(String id, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-7-22 下午2:32:32
	 * Description 在工程选择 拒绝 和 接受 任务之前判断所选任务中是否包含不能拒绝 和接收的任务
	 * @param id 巡检计划id
	 * @param type 操作类型 
	 * @param j
	 * @param userId 
	 * @return
	 */
	public boolean judgeIpOfEgRefusePlan(String id, String type, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-7-22 下午3:39:08
	 * Description 在工程选择填写巡检报告之前判断所选任务是否可以
	 * @param id 巡检计划id
	 * @param j
	 * @param userId 
	 */
	public boolean judgePlanOfEgAddReport(String id, AjaxJson j, String userId);

	/**@author xiul
	 * 2016-8-9 上午11:10:48
	 * Description APP 第三方巡检页查询
	 * @param req 
	 */
	public Map<String, Object> queryAppIpTpList(int type, String area, String planYear, String planMonth, String esSn, String cmId);

	/**@author xiul
	 * 2016-8-9 下午4:47:09
	 * Description APP 查询巡检详情
	 * @param ipId 巡检计划id
	 */
	public Map<String, Object> queryIpDetailOfTP(String ipId);

	/**@author xiul
	 * 2016-8-12 下午9:49:29
	 * Description APP - 根据 设备sn或者影院名称 查询数据集合
	 */
	public List<Map<String, Object>> queryEsOrCm(HttpServletRequest req);

	/**@author xiul
	 * 2016-8-16 下午12:54:18
	 * Description APP - 设备变更申请页 - 影院查询 
	 */
	public List<Map<String, Object>> queryCmForAppEsChange(
			HttpServletRequest req);

	public Map<String, Object> queryAppIpAegList(int type, String area, String planYear, String planMonth, String esSn, String cmId);

	/**@author xiul
	 * 2016-8-17 下午4:05:34
	 * Description  APP - 工程师巡检列表数据请求 
	 */
	public Map<String, Object> queryAppIpEgList(int type, String area, String planYear, String planMonth, String esSn, String cmId);

	/**@author xiul
	 * 2016-8-18 下午2:26:57
	 * Description APP - 工程师签到 后显示的详情页
	 */
	public Map<String, Object> appEgSignInDetial(HttpServletRequest req);

	/**@author xiul
	 * 2016-8-18 下午6:23:30
	 * Description APP - 第三方 工程师 巡检计划详细页
	 */
	public Map<String, Object> queryIpDetailOfEg(String ipId);

	/**@author xiul
	 * 2016-8-24 下午2:53:47
	 * Description  APP - 查询首页巡检代办数量
	 */
	public int queryAppAegOrEgTodoIps();

	/**@author xiul
	 * 2016-8-25 上午10:29:58
	 * Description APP - 查询自己代办进行中，如果是区域工程师还要 查询子工程师 代办和进行中数量
	 * @param egId
	 */
	public Map<String, Object> queryEgTasks(String egId);

	/**@author xiul
	 * 2016-9-2 下午4:59:57
	 * Description APP - 区域工程师 查询巡检计划详细
	 * @param ipId 巡检计划ID
	 */
	public Map<String, Object> queryIpDetailOfAeg(String ipId);

	/**@author xiul
	 * 2016-9-5 上午11:06:10
	 * Description APP - 工程师开始巡检（签到）
	 */
	public AjaxJson appEgSignIn(HttpServletRequest req, AjaxJson j);

	/**@author xiul
	 * 2016-9-23 下午3:47:20
	 * Description 流程 - 工程师修改预约上门时间之前判断是否可以修改
	 * @param id 巡检计划ID
	 * @param j
	 * @param userId 登录用户id
	 */
	public boolean doJudgeForEgUpdateEgOrderTime(String id, AjaxJson j,
			String userId);


    /**
     * 根据年份查询所有设备最近的巡检id
     * @param year 2016 如果为空默认为当年
     * @return
     */
    List<Map<String,Object>> queryPlanIdWithYear(String year);

    /**
     * 查询影院所属设备特定年份下的最新巡检计划
     * @param cinemaId
     * @param year 如果为空默认为当年
     * @return
     */
    List<ZyInspectionPlanEntity> queryPlanWithCinemaAndYear(String cinemaId,String year);

    /**
     * 检查是否可以修改工程师预约上门时间
     * @param modifyDateString yyyy-MM-dd
     * @return
     */
	public ZyInspectionPlanServiceImpl.UpdateOrdertimeReason checkIfCanUpdateEngineerOrderTime(ZyInspectionPlanEntity plan, String modifyDateString);

    public ZyInspectionPlanServiceImpl.UpdateOrdertimeReason updatePlanDate(ZyInspectionPlanEntity plan,String planDate);

    /**
     * 根据巡检计划查询巡检报告的类型供app判断显示不同的内容
     * @author xiul
     */
	public void queryReportType(AjaxJson j, HttpServletRequest req);

	/**@author xiul
	 * 2016-9-22 下午5:26:23
	 * Description 巡检问题分析报表中 按巡检问题类型汇总 列表中 巡检任务总数 进来的查询
	 * @param ipEndTimeYear 巡检计划 endtime 年份
	 * @param ipEndTimeMonth 巡检计划 endtime 月份
	 */
	public List<String> getPlanIdsByIrExReportConditions(String ipEndTimeYear,String ipEndTimeMonth);

	/**
	 * 区域工程师分配任务 查询工程师及任务
	 * @param req
	 * @param j
	 */
	public void queryEngineerForAppAegSendIp(HttpServletRequest req, AjaxJson j);

	
}
